package com.jframe.sys.controller.utils;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;

import com.jframe.sys.utils.JsonUtil;
import com.jframe.sys.utils.StringUtil;

/**
 *<pre><b><font color="blue">Param</font></b></pre>
 *
 *<pre><b>&nbsp;--描述说明--</b></pre>
 * <pre>
 * Flex端传Map参数过来后，可通过本类获取指定的参数值。
 * </pre>
 * <pre>
 * <b>--样例--</b>
 *   Param obj = new Param();
 *   obj.method();
 * </pre>
 * JDK版本：JDK1.4
 * @author  <b>gezc</b> 
 */
public class Param {
	
	/**
	 * 客户端Map的参数副本
	 */
	private Map map = new HashMap();
	
	/**
	 * 构造函数
	 */
	public Param(){}
	
	/**
	 * 构造函数2
	 * @param map 客户端的Map参数
	 */
	public Param(Map map){
		this.map = map;
	}
	
	public Param(HttpServletRequest request){
		Map parameterMap = request.getParameterMap();
		
		Iterator kit= parameterMap.keySet().iterator();
		Map param=new HashMap();
		while(kit.hasNext()){
			String key=String.valueOf(kit.next());
			String[] v=null;
			try {
				v=(String[])parameterMap.get(key);
			} catch (Exception e) {
				continue;
			}
			if (v!=null && v.length==1){
				param.put(key,v[0]);
			}else{
				param.put(key,v);
			}
		}
		this.map = param;
		
	}
	
	
	/**
	 * @return the map
	 */
	public Map getMap() {
		return map;
	}

	/**
	 * @param map the map to set
	 */
	public void setMap(Map map) {
		this.map = map;
	}

	/**
	 * 从Map中获取key对应的对象，如果不存在返回def
	 * @param map 客户端Map
	 * @param key map索引key
	 * @param def 默认值
	 * @return  存在返回map中的对象，不存在返回def
	 * @author:gezc
	 */
	public Object get(Map map,String key,Object def)
	{
		if("".equals(key)) return def;
		Object obj = map.get(key);
		return obj!=null ? obj:def;
	}
	/**
	 * 从Map中获的Key对象，如果不存在返回 null
	 * @param map 客户端Map
	 * @param key map 索引key
	 * @return  存在返回key对象对象，不存在返回null
	 * @author:gezc
	 */
	public Object get(Map map ,String key)
	{
		return this.get(map, key, null);
	}
	/**
	 * 从Map中获的Key对应的对象，如果不存在返回 def ,map在构造函数中注入或set注入
	 * @param key 索引
	 * @param def 默认值
	 * @return 存在返回对应值，不存在返回def
	 * @author:gezc
	 */
	public Object get(String key,Object def)
	{
		return this.get(map, key, def);
	}
	/**
	 * 从Map中获得key对应的对象，不存在返回null ,map在构造函数中注入或set注入
	 * @param key 索引
	 * @return 返回key对象对象，不存在返回null
	 * @author:gezc
	 */
	public Object get(String key)
	{
		return this.get(key, null);
	}
	
	/**
	 * 从Map中获取key对应的整数，如果不存在返回def
	 * @param map 客户端Map
	 * @param key map索引key
	 * @param def 默认值
	 * @return  存在返回map中的整数，不存在返回def
	 * @author:gezc
	 */
	public int getInt(Map map,String key ,int def)
	{
		 Object obj =  this.get(map, key,  def+"");
		 String value = obj==null ? "" : (String) obj;
		 return StringUtil.parseInt(value );
		
	}
	/**
	 * 从Map中获的Key整数，如果不存在返回 0
	 * @param map 客户端Map
	 * @param key map 索引key
	 * @return  存在返回key对象整数，不存在返回0
	 * @author:gezc
	 */
	public int getInt(Map map ,String key)
	{
		return this.getInt(map, key, 0);
	}
	/**
	 * 从Map中获的Key对应整数，如果不存在返回 def ,map在构造函数中注入或set注入
	 * @param key 索引
	 * @param def 默认值
	 * @return 存在返回对应值，不存在返回def
	 * @author:gezc
	 */
	public int getInt(String key,int def)
	{
		return this.getInt(map, key, def);
	}
	/**
	 * 从Map中获的Key对应整数，如果不存在返回 0,map在构造函数中注入或set注入
	 * @param key 索引
	 * @return 存在返回对应值，不存在返回0
	 * @author:gezc
	 */
	public int getInt(String key)
	{
		return this.getInt(key, 0);
	}
	/**
	 * 从Map中获的Key长整型数，如果不存在返回def
	 * @param map 客户端Map
	 * @param key map 索引key
	 * @param def 默认值
	 * @return  存在返回key对应的长整形整数，不存在返回def
	 * @author:gezc
	 */
	public long getLong(Map map,String key,long def)
	{
		Object obj = this.get(map, key, def+"");
		String value = obj==null ?  "" : (String) obj;
		return  StringUtil.parseLong(value );
	
	}
	/**
	 * 从Map中获的Key长整型数，如果不存在返回0
	 * @param map 客户端Map
	 * @param key map 索引key
	 * @return  存在返回key对应的长整形整数，不存在返回0
	 * @author:gezc
	 */
	public long getLong(Map map ,String key)
	{
		return this.getLong(map, key, 0);
	}
	
	/**
	 * 从Map中获的Key对应长整形整数，如果不存在返回 def ,map在构造函数中注入或set注入
	 * @param key 索引
	 * @param def 默认值
	 * @return 存在返回对应值，不存在返回def
	 * @author:gezc
	 */
	public long getLong(String key,long def)
	{
		return this.getLong(map, key, def);
	}
	/**
	 * 从Map中获的Key对应长整数，如果不存在返回 0,map在构造函数中注入或set注入
	 * @param key 索引
	 * @return 存在返回对应值，不存在返回0
	 * @author:gezc
	 */
	public long getLong(String key)
	{
		return this.getLong(key,0);
	}
	
	
	/**
	 * 从Map中获取key对应的字符串，如果不存在返回def
	 * @param map 客户端Map
	 * @param key map索引key
	 * @param def 默认值
	 * @return  存在返回map中的字符串，不存在返回def
	 * @author:gezc
	 */
	public String getString(Map map,String key,String def)
	{
		Object obj = this.get(map, key, def);
		return obj!=null ? obj.toString():null;
		
	}
	/**
	 * 从Map中获的Key字符串，如果不存在返回""
	 * @param map 客户端Map
	 * @param key map 索引key
	 * @return  存在返回key对应的字符串，不存在返回“”
	 * @author:gezc
	 */
	public String getString(Map map ,String key)
	{
		return this.getString(map, key, "");
	}
	/**
	 * 从Map中获的Key对应字符串，如果不存在返回 def ,map在构造函数中注入或set注入
	 * @param key 索引
	 * @param def 默认值
	 * @return 存在返回对应值，不存在返回def
	 * @author:gezc
	 */
	
	public String getString(String key,String def)
	{
		return this.getString(map, key, def);
	}
	/**
	 * 从Map中获的Key对应字符串，如果不存在返回“”,map在构造函数中注入或set注入
	 * @param key 索引
	 * @return 存在返回对应值，不存在返回“”
	 * @author:gezc
	 */
	public String getString(String key)
	{
		return this.getString(key, "");
	}
	
	public boolean getBoolean(String key){
		boolean b = false;
		try{
			if(get(key)!=null){
				b = (Boolean)this.get(key);
			}
		}catch(Exception e){
			
		}
		return b;
	}
	/**
	 * 获取对象
	 * @param clz
	 * @return
	 */
	public Object getObj(Class clz){	
		Field[] fields = clz.getDeclaredFields();
		String objJson = "{";
		for(Field field :fields){
			String name = field.getName() ;
			if(name.equals("serialVersionUID")) continue;
			objJson += "\"" + name + "\"  : \"" + map.get(name) + "\","; 
		}
		objJson +="}";
		return JsonUtil.json2Obj(objJson, clz);
	}
	
	public double getDouble(Map map,String key,double def){
		String value = this.getString(map, key, def + "");
		return StringUtil.parseDouble(value);
	}
	
	public double getDouble(Map map ,String key){
		return this.getDouble(map, key, 0);
	}
	
	public double getDouble(String key,double def){
		return this.getDouble(map, key, def);
	}
	
	public double getDouble(String key){
		return this.getDouble(map, key);
	}
	
	public float getFloat(Map map,String key,float def){
		String value = this.getString(map, key, def + "");
		return StringUtil.parseFloat(value);
	}
	
	public float getFloat(Map map,String key){
		return this.getFloat(map, key, 0);
	}
	public float getFloat(String key ,float def){
		return this.getFloat(map, key,def);
	}
	public float getFloat(String key){
		return this.getFloat(map, key);
	}
}
